package org.bibpessoal.daos;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import org.bibpessoal.entidade.Emprestimo;
import org.bibpessoal.entidade.Livro;
import org.bibpessoal.entidade.Usuario;

public class LivroDAO {

     	private Connection con;
		private Statement comando;

		public LivroDAO() {
			super();
			conectar();
		}

		private void conectar() {
			if (con == null) {
				try {  
					con = FabricaDeConexao.getConexao();  
					comando = con.createStatement();  
					System.out.println("Conectado!");  
				} catch (ClassNotFoundException e) {  
					imprimeErro("Erro ao carregar o driver", e.getMessage());  
				} catch (SQLException e) {  
					imprimeErro("Erro ao conectar", e.getMessage());  
				}  
			}
		} 

		public void fechar() {  
			try {  
				comando.close();  
				con.close();  
				System.out.println("Conex�o Fechada");  
			} catch (SQLException e) {  
				imprimeErro("Erro ao fechar conex�o", e.getMessage());  
			}  
		}  

		private void imprimeErro(String msg, String msgErro) {   
			System.err.println(msg);  
			System.out.println(msgErro);  
		} 

		public boolean cadastraLivro(Livro novo) {
			conectar();
		
			
			try {
				PreparedStatement psInsere = con.prepareStatement("INSERT INTO livro (titulo,autores,editora,ano,isbn, id_usuario) VALUES (?,?,?,?,?,?)");
				psInsere.setString(1,novo.getTitulo());
				psInsere.setString(2,novo.getAutores());
				psInsere.setString(3,novo.getEditora());
				psInsere.setLong(4,novo.getAno());
				//psInsere.setInt(5,novo.getUsuario().getId());
				psInsere.setLong(5, novo.getIsbn());
				psInsere.setInt(6,novo.getUsuario().getId());
				
				int result = psInsere.executeUpdate();
				return result > 0;
			} catch (SQLException e) {
				imprimeErro("Erro ao cadastrar livro", e.getMessage());
			}
			return false;
		} 
		
		public List listarlivrosCadastrados (Usuario usr){
			conectar();
			ResultSet rs;
			try {  
				PreparedStatement ps = con.prepareStatement("SELECT * FROM livro where id_usuario=?");
				ps.setInt(1, usr.getId());
				rs = ps.executeQuery();
				List livros = new ArrayList();  
				while( rs.next() )  
				{  
				    Livro l = new Livro();  
				    l.setId(rs.getInt("id")); //setId(rs.getInt("id"));
				    l.setTitulo( rs.getString("titulo" )); 
				    l.setAutores(rs.getString("autores"));
				    livros.add(l);  
				}  
				
				return livros;
				
			    
			} catch (SQLException e) {  
				imprimeErro("Erro ao buscar usuarios", e.getMessage());  
			}
			
			return null;
			
		} 	
		
		
		public List buscaLivro(Livro livro, int tipo_busca){
			
			conectar();
			ResultSet rs;
			PreparedStatement ps = null;
			try { 
				if(tipo_busca == 1){ //caso esteja buscando pelo título
					ps = con.prepareStatement("SELECT lv.*, usr.nome as usuario FROM livro lv join usuario usr ON lv.id_usuario=usr.id where titulo like ?");
					ps.setString(1, "%"+livro.getTitulo()+"%");
				}else { //caso esteja buscando pelo autor
					ps = con.prepareStatement("SELECT lv.*, usr.nome as usuario FROM livro lv join usuario usr ON lv.id_usuario=usr.id where autores like ?");
					ps.setString(1, "%"+livro.getAutores()+"%");
				}
				System.out.println(ps);
				rs = ps.executeQuery();
				List livros = new ArrayList();  
				while( rs.next() )  
				{  
				    Livro l = new Livro();  
				    Usuario usr = new Usuario();
				    usr.setId(rs.getInt("id_usuario"));
				    usr.setNome(rs.getString("usuario"));
				    l.setId(rs.getInt("id")); //setId(rs.getInt("id"));
				    l.setTitulo( rs.getString("titulo" )); 
				    l.setAutores(rs.getString("autores"));
				    l.setUsuario(usr);
				    livros.add(l);  
				}  
				
				return livros;
				
			    
			} catch (SQLException e) {  
				imprimeErro("Erro ao buscar usuarios", e.getMessage());  
			}
			
			return null;
			
			
			
		}
		
		public boolean emprestimoLivro(Emprestimo emprestimo){
			conectar();
			ResultSet rs;
			
			try {
				PreparedStatement ps = con.prepareStatement("SELECT 1 FROM usuario where id=?");
				ps.setInt(1, emprestimo.getId_responsavel());
				rs = ps.executeQuery();
				if(!rs.next()){
					PreparedStatement pss = con.prepareStatement("INSERT INTO emprestimo (id_usuario,id_livro,data,nome_responsavel,telefone_responsavel,email_responsavel) VALUES (?,?,?,?,?,?)");
					pss.setInt(1, emprestimo.getDono().getId());
					pss.setInt(2, emprestimo.getLivro_emprestado().getId());
					pss.setDate(3, new java.sql.Date(emprestimo.getData().getTime()));
					pss.setString(4, emprestimo.getNome_responsavel());
					pss.setString(5, emprestimo.getTelefone_responsavel());
					pss.setString(6, emprestimo.getEmail_responsavel());
					
					pss.executeUpdate();
					
				}else{
					PreparedStatement pss = con.prepareStatement("INSERT INTO emprestimo (id_usuario,id_livro,data,nome_responsavel,telefone_responsavel,email_responsavel,id_responsavel) VALUES (?,?,?,?,?,?,?)");
					pss.setInt(1, emprestimo.getDono().getId());
					pss.setInt(2, emprestimo.getLivro_emprestado().getId());
					pss.setDate(3, new java.sql.Date(emprestimo.getData().getTime()));
					pss.setString(4, emprestimo.getNome_responsavel());
					pss.setString(5, emprestimo.getTelefone_responsavel());
					pss.setString(6, emprestimo.getEmail_responsavel());
					pss.setInt(7, emprestimo.getId_responsavel());
					pss.executeUpdate();
				}
				
				return true;
				
				
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			return false;
			
			
		}
		
		
}
